package com.atguigu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 引入RabbitMQ
 * 1.引入amqp: RabbitAutoConfiguration自动生效
 * 2.给容器中自动配置
 * rabbitTemplate AmqpAdmin CachingConnectionFactory  RabbitMessagingTemplate
 * 3.开启： @EnableRabbit
 * 4.在配置文件设置相对信息
 *
 * 本地事务失效 采用动态代理
 * 1.）引入aop动态代理 引入了aspectj
 * 2.）@EnableAspectJAutoProxy (exposeProxy = true) 开启 aspectj动态代理。以后所有的动态代理 aspectj动态代理
 *              (exposeProxy = true) 对外暴露代理对象
 * 本类方法调用
 *        OrderServiceImpl  orderService = (OrderServiceImpl) AopContext.currentProxy();
 *             orderService.submitOrder();
 *
 *Seata 控制分布式事务
 * 1）.每一个微服务先必须创建 undo_log;
 * 2.)安装事务协调器
 * 3.） 整合
 *      1.导入依赖 spring-cloud-starter-alibaba-seata
 *      2.解压启动 seata-server
 *             registry。conf: 配置文件， 修改注册中心 nacos
 *                              配置中心 file.conf
 *      3.用到分布式事务的微服务 使用seata DAtaSourceProxy代理
 *      4.每一个微服务都要导入
 *          registry.conf
 *          file.conf
 *            vgroup_mapping.{服务名}-fescar-service-group
 *       5.分布式大事务加上@GlobalTransactional 注解
 *       6.小事务加上  @Transactional
 */
@EnableFeignClients("com.atguigu.gulimall.order.feign")
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
